package com.demo.core.service.base;

import java.util.List;
import java.util.Map;

import com.demo.core.model.Function;
import com.demo.core.model.SiteFunction;

/**
 * 站点功能服务
 * 
 * @author ryuu.kk
 *
 */
public interface SiteFunctionService extends BaseCoreService<SiteFunction, Long> {

	/**
	 * 删除站点所有功能
	 * @param siteId 站点ID
	 */
	void deleteAll(Long siteId);
	
	/**
	 * 为站点分配所指定的功能
	 * @param siteId 站点ID
	 * @param enabled 可用标志
	 * @param functionList 功能列表
	 */
	void saveAll(Long siteId, boolean enabled, List<Function> functionList);
	
	/**
	 * 更新状态
	 * @param id 主键ID
	 * @param status 状态
	 * @param enabled 是否可用
	 */
	void update(Long id, String status, boolean enabled);
	
	/**
	 * 更新状态
	 * @param siteId 站点ID
	 * @param functionId 功能ID
	 * @param status 状态
	 * @param enabled 是否可用
	 */
	void update(Long siteId, Long functionId, String status, boolean enabled);
	
	/**
	 * 更新所有信息
	 * @param siteId 站点ID
	 * @param status 状态
	 * @param enabled 可用标志
	 */
	void updateAll(Long siteId, String status, boolean enabled);

	/**
	 * 查询站点功能模型
	 * @param id 主键ID
	 * @return 站点功能模型对象
	 */
	SiteFunction find(Long id);
	
	/**
	 * 查询站点功能模型
	 * @param siteId 站点ID
	 * @return 站点功能模型对象
	 */
	List<SiteFunction> findAll(Long siteId);
	
	/**
	 * 联合查询。通过站点ID查询站点对应的功能模型列表
	 * 这是一个站点所授权功能的集合。站点功能由站点的不同类型进行授权
	 * @param siteId 站点ID
	 * @return 站点功能列表
	 */
	List<SiteFunction> query(Long siteId);
	
	/**
	 * 联合查询。通过站点ID查询站点对应的功能模型列表
	 * 这是一个站点所授权功能的集合。站点功能由站点的不同类型进行授权
	 * @param siteId 站点ID
	 * @param i18n 国际化字符串
	 * @return 站点功能列表
	 */
	List<SiteFunction> query(Long siteId, String i18n);
	
	/**
	 * 联合查询。通过站点ID查询站点对应的功能模型列表
	 * 这是一个站点所授权功能的集合。站点功能由站点的不同类型进行授权
	 * @param siteId 站点ID
	 * @param functionId 功能ID
	 * @return 站点功能列表
	 */
	List<SiteFunction> query(Long siteId, Long functionId);
	
	/**
	 * 联合查询站点所有功能(Tree结构),包含站点已分配和未分配的功能
	 * 通过节点ID,站点ID,站点组ID和树的深度查询站点功能树
	 * 注意:站点功能树结构由功能数据模型指定
	 * @param id 树节点ID
	 * @param siteId 站点ID
	 * @param siteGroupId 站点组ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction queryFunctionTree(Long id, Long siteId, Long siteGroupId, int... depths);
	
	/**
	 * 联合查询站点所有功能(Tree结构),包含站点已分配和未分配的功能
	 * 通过节点ID,站点ID和树的深度查询站点功能树
	 * 注意:站点功能树结构由功能数据模型指定
	 * @param id 树节点ID
	 * @param siteId 站点ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction queryFunctionTree(Long id, Long siteId, int... depths);
	
	/**
	 * 联合查询站点所有功能(Tree结构),包含站点已分配和未分配的功能
	 * 站点ID和树的深度查询站点功能树
	 * 注意:站点功能树结构由功能数据模型指定
	 * @param siteId 站点ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction queryFunctionTreeRoot(Long siteId, int... depths);
	
	/**
	 * 联合查询站点已分配的所有功能(Tree结构)
	 * 通过节点ID,站点ID,站点组ID和树的深度查询站点功能树
	 * 注意:站点功能树结构由功能数据模型指定
	 * @param id 树节点ID
	 * @param siteId 站点ID
	 * @param siteGroupId 站点组ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction querySiteFunctionTree(Long id, Long siteId, Long siteGroupId, int... depths);
	
	/**
	 * 联合查询站点已分配的所有功能(Tree结构)
	 * 通过节点ID,站点ID和树的深度查询站点功能树
	 * 注意:站点功能树结构由功能数据模型指定
	 * @param id 树节点ID
	 * @param siteId 站点ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction querySiteFunctionTree(Long id, Long siteId, int... depths);
	
	/**
	 * 联合查询站点已分配的所有功能(Tree结构)
	 * 站点ID和树的深度列表查询根节点开始树结构
	 * @param siteId 站点ID
	 * @param depths 深度(可选)
	 * @return 站点功能树
	 */
	SiteFunction querySiteFunctionTreeRoot(Long siteId, int... depths);
	
	/**
	 * 通过站点ID查询站点功能模型Map
	 * @param siteId 站点ID
	 * @param enabled 功能是否可用
	 * @return 站点功能模型Map （key:functionId & value:包含Function模型的SiteFunction）
	 */
	Map<Long, SiteFunction> querySiteFunctionMap(Long siteId, Boolean enabled);
	
	/**
	 * 通过站点ID查询站点功能模型List
	 * <br>
	 * 该模型将会是所有功能模型+站点分配的功能+角色对应能站点功能
	 * 功能N > 站点分配的功能S > 角色分配的功能 T
	 * <blockquote>注意:
	 * <font color="red">该模型将包含【功能模型】和【角色模型列表】</font>
	 * </blockquote>
	 * @param siteId 站点ID
	 * @return 站点功能模型Map （key:functionId & value:包含Function模型的SiteFunction）
	 */
	List<SiteFunction> querySiteFunctionAndRoleList(Long siteId, String type);
	
	/**
	 * 通过站点ID查询站点功能模型Map
	 * <br>
	 * 该模型将会是所有功能模型+站点分配的功能+角色对应能站点功能
	 * 功能N > 站点分配的功能S > 角色分配的功能 T
	 * <blockquote>注意:
	 * <font color="red">该模型将包含【功能模型】和【角色模型列表】</font>
	 * </blockquote>
	 * @param siteId 站点ID
	 * @return 站点功能模型Map （key:functionId & value:包含Function模型的SiteFunction）
	 */
	Map<Long, SiteFunction> querySiteFunctionAndRoleMap(Long siteId, String type);
}
